package com.vates.reservas.dao.impl;

import com.vates.reservas.dao.ReservaDAO;
import com.vates.reservas.dominio.Reserva;

import java.util.Date;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

@Repository(value = "reservaDAO")
public class ReservaDAOImpl implements ReservaDAO {

	private EntityManager em = null;

	/*
	 * Sets the entity manager.
	 */
	@PersistenceContext
	public void setEntityManager(EntityManager em) {
		this.em = em;
	}

	@Transactional(readOnly = false)
	public void nuevo(Reserva objeto) {
		em.merge(objeto);

	}

	@Transactional(readOnly = false)
	public void modificar(Reserva objeto) {
		em.merge(objeto);

	}

	@Transactional(readOnly = false)
	public void eliminar(Reserva objeto) {
		objeto = em.merge(objeto);
		em.remove(objeto);

	}

	@Transactional(readOnly = true)
	@SuppressWarnings("unchecked")
	public List<Reserva> listado() {
		return em.createQuery("SELECT r FROM Reserva r ORDER BY r.id")
				.getResultList();
	}

	@Transactional(readOnly = true)
	public Reserva busquedaPorId(long id) {
		Reserva reserva = em.find(Reserva.class, id);
		return reserva;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Reserva> busquedaPorNumeroDeHotelYFechas(long id,
			Date fechaInicio, Date fechaFin) {
		Query consulta = em.createNativeQuery("SELECT r.* FROM Reserva r"
				+ " JOIN tipo_habitacion th ON r.id_tipohab = th.id_tipohab"
				+ " WHERE th.id_hotel = ?" + " AND r.fecha_ini = ?"
				+ "AND r.fecha_fin = ?", Reserva.class);
		consulta.setParameter(1, id);
		consulta.setParameter(2, fechaInicio);
		consulta.setParameter(3, fechaFin);
		return consulta.getResultList();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Reserva> busquedaPorNumeroDeClienteYFechas(long id,
			Date fechaInicio, Date fechaFin) {
		Query consulta = em.createQuery("SELECT r FROM Reserva r"
				+ " WHERE r.cliente.id = :nroCliente"
				+ " AND r.fechaInicio = :fechaInicio"
				+ " AND r.fechaFin = :fechaFin");
		consulta.setParameter("nroCliente", id);
		consulta.setParameter("fechaInicio", fechaInicio);
		consulta.setParameter("fechaFin", fechaFin);
		return consulta.getResultList();
	}

}